import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'

// https://vite.dev/config/
export default defineConfig({
  plugins: [vue()],

  // 路径别名配置
  resolve: {
    alias: {
      '@': resolve(__dirname, 'src')
    }
  },

  // 开发服务器配置
  server: {
    port: 8080,
    open: true,
    host: '0.0.0.0', // 允许外部访问

    // API代理配置
    proxy: {
      '/api': {
        target: 'http://cloud-test.huichuangpin.com',
        changeOrigin: true,
        secure: false, // 如果是 https 接口，需要配置这个
        timeout: 30000, // 代理超时时间
        // rewrite: (path) => path.replace(/^\/api/, '') // 如果需要重写路径，取消注释

        // 配置代理日志，方便调试
        configure: (proxy, _options) => {
          proxy.on('error', (err, _req, _res) => {
            console.log('proxy error', err);
          });
          proxy.on('proxyReq', (proxyReq, req, _res) => {
            console.log('Sending Request to the Target:', req.method, req.url);
          });
          proxy.on('proxyRes', (proxyRes, req, _res) => {
            console.log('Received Response from the Target:', proxyRes.statusCode, req.url);
          });
        },
      }
    }
  },

  // 构建配置
  build: {
    // 输出目录
    outDir: 'dist',
    // 静态资源目录
    assetsDir: 'assets',
    // 小于此阈值的导入或引用资源将内联为 base64 编码
    assetsInlineLimit: 4096,
    // 启用/禁用 CSS 代码拆分
    cssCodeSplit: true,
    // 构建后是否生成 source map 文件
    sourcemap: false,
    // 设置最终构建的浏览器兼容目标
    target: 'es2015',
    // 启用/禁用 brotli 压缩大小报告
    reportCompressedSize: true,
    // chunk 大小警告的限制（以 kbs 为单位）
    chunkSizeWarningLimit: 2000,
    // rollup 配置
    rollupOptions: {
      output: {
        // 分包配置
        manualChunks: {
          // 将 Vue 相关库打包到 vue-vendor
          'vue-vendor': ['vue', 'vue-router'],
          // 将 Element Plus 相关库打包到 element-vendor
          'element-vendor': ['element-plus'],
          // 将工具库打包到 utils-vendor
          'utils-vendor': ['axios']
        },
        // 资源文件命名
        assetFileNames: (assetInfo) => {
          const info = assetInfo.name.split('.')
          let extType = info[info.length - 1]
          if (/\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/i.test(assetInfo.name)) {
            extType = 'media'
          } else if (/\.(png|jpe?g|gif|svg)(\?.*)?$/i.test(assetInfo.name)) {
            extType = 'img'
          } else if (/\.(woff2?|eot|ttf|otf)(\?.*)?$/i.test(assetInfo.name)) {
            extType = 'fonts'
          }
          return `${extType}/[name]-[hash][extname]`
        },
        // JS 文件命名
        chunkFileNames: 'js/[name]-[hash].js',
        entryFileNames: 'js/[name]-[hash].js'
      }
    }
  },

  // 预览服务器配置（用于 preview 模式）
  preview: {
    port: 4173,
    host: '0.0.0.0',
    open: true
  },

  // 环境变量配置
  define: {
    // 在生产构建中移除 console
    __VUE_PROD_DEVTOOLS__: false,
    __VUE_OPTIONS_API__: true
  },

  // CSS 相关配置
  css: {
    // CSS 预处理器配置
    preprocessorOptions: {
      scss: {
        // 全局 SCSS 变量
        additionalData: `
          $primary-color: #409eff;
          $success-color: #67c23a;
          $warning-color: #e6a23c;
          $danger-color: #f56c6c;
          $info-color: #909399;
        `
      }
    },
    // 配置 CSS modules
    modules: {
      localsConvention: 'camelCase'
    }
  },

  // 优化相关配置
  optimizeDeps: {
    include: [
      'vue',
      'vue-router',
      'element-plus',
      'axios'
    ],
    exclude: []
  },

  // 实验性功能
  experimental: {
    // 启用一些实验性功能
  }
})
